// @flow
import React, { Component } from 'react'
import { Modal, Form, Input, message, InputNumber } from 'antd'
import universalFetch, { handleFetchError } from 'store/modules/fetch'
const FormItem = Form.Item
const formItemLayout = {
  labelCol: {
    xs: { span: 24 },
    sm: { span: 6 }
  },
  wrapperCol: {
    xs: { span: 24 },
    sm: { span: 14 }
  }
}

type Props = {
  form: Object,
  removeNode: Function,
  refreshPoint: Function,
  data: Object,
}

type States = {
  point: Object,
  visible: boolean,
  confirmLoading: boolean
}
class EditPoint extends Component {
  props: Props
  state: States
  closeModal: Function
  handleSubmit: Function
  constructor (props: Props) {
    super(props)
    this.state = {
      point: {},
      visible: true,
      confirmLoading: false
    }
    this.closeModal = this.closeModal.bind(this)
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  closeModal () {
    this.setState({
      visible: false
    })
    this.props.removeNode()
  }

  handleSubmit () {
    const form = this.props.form
    form.validateFields((err, fieldsValue) => {
      if (err) {
        return false
      }
      this.setState({
        confirmLoading: true
      })
      const { refreshPoint, data, removeNode } = this.props
      const values = {
        ...fieldsValue
      }

      universalFetch(`${__SERVICE_API__}device/monitors/points/${data.id}`, {
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        method: 'PUT',
        body: JSON.stringify(values)
      })
      .then(res => res.json())
      .then((json) => {
        if (json.code !== 200000) {
          throw new Error(JSON.stringify({ code: json.code, message: json.message }))
        }
        this.setState({
          visible: false,
          confirmLoading: false
        })
        message.success('修改成功')
        refreshPoint()
        removeNode()
      })
      .catch((error) => {
        handleFetchError(error)
        console.error(error)
        this.setState({
          confirmLoading: false
        })
        message.error('修改失败: ' + error.message)
      })
    })
  }
  checkNum (rule, value, callback) {
    const checkNum = /^[0-9]+$/
    const checkReg = /^[a-zA-Z0-9_]*$/
    if (value && !checkReg.test(value)) {
      callback('只能输入英文、数字和下划线')
    } else {
      if (checkNum.test(value)) {
        callback('不能是纯数字')
      } else {
        callback()
      }
    }
  }
  render () {
    const { getFieldDecorator } = this.props.form
    const { data } = this.props
    const { visible, confirmLoading } = this.state
    return (
      <Modal
        title='修改测点'
        visible={visible}
        onCancel={this.closeModal}
        confirmLoading={confirmLoading}
        onOk={this.handleSubmit}
        >
        <Form>
          <FormItem {...formItemLayout} label='传感器名字' hasFeedback>
            {getFieldDecorator('sensorName', {
              rules: [
                { required: true, message: '请填写传感器名字', whitespace: true }
              ],
              initialValue: data.sensorName
            })(
              <Input placeholder='请填写传感器名字' />
            )}
          </FormItem>
          <FormItem {...formItemLayout} label='传感器类型' hasFeedback>
            {getFieldDecorator('sensorType', {
              rules: [
                { required: true, message: '请填写传感器类型', whitespace: true }
              ],
              initialValue: data.sensorType
            })(
              <Input placeholder='请填写传感器类型' />
            )}
          </FormItem>
          <FormItem {...formItemLayout} label='表名' hasFeedback>
            {getFieldDecorator('nameEn', {
              rules: [
                { required: true, message: '请填写表名', whitespace: true },
                { validator: this.checkNum }
              ],
              initialValue: data.nameEn
            })(
              <Input placeholder='请填写表名' />
            )}
          </FormItem>
          <FormItem {...formItemLayout} label='通道ID' hasFeedback>
            {getFieldDecorator('channelId', {
              rules: [
                { required: true, message: '请填写通道ID', whitespace: true }
              ],
              initialValue: data.channelId
            })(
              <InputNumber style={{ width:284 }} />
            )}
          </FormItem>
        </Form>
      </Modal>
    )
  }
}

export default Form.create()(EditPoint)
